home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / asm68k.arc / ASM68K.MAR < prev    next >
Text File  |  1985-11-09  |  10KB  |  391 lines

  1.     .NLIST    TTM,BEX
  2.     .TITLE    MC68000 CROSS ASSEMBLER SUPPORT
  3. ;
  4. ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  5. ;
  6. ; ASSEMBLY LANGUAGE SUBROUTINES FOR MC68000 CROSS-ASSEMBLER.
  7. ; FORTRAN LINKAGE TO THESE ROUTINES IS AS FOLLOWS:
  8. ;    1. RETURN VIA 'RTS PC'.
  9. ;    2. R5 POINTS TO PARAMETER LIST WITH FOLLOWING:
  10. ;        A. NUMBER OF PARAMETERS.
  11. ;        B. ADDRESS OF FIRST PARAMETER
  12. ;        C. ADDRESS OF SECOND PARAMETER, ETC.
  13. ;    3. FUNCTION SUBROUTINES (INTEGER) RETURN VALUE IN R0.
  14. ;
  15. ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  16. ;
  17. ; ** I4CLR **
  18. ;
  19. ; CLEAR LOW AND HIGH WORDS OF DOUBLE PRECISION VARIABLE
  20. ; ADR OF LOW WORD PASSED VIA (R5)
  21. ;
  22. I4CLR::    TST (R5)+
  23.     MOV R0,-(SP)
  24.     MOV (R5),R0
  25.     CLR (R0)+
  26.     CLR (R0)
  27.     MOV (SP)+,R0
  28.     RTS PC
  29. ;
  30. ; ** GETBIT **
  31. ;
  32. ; SUBROUTINE TO CONVERT 4 LSB OF A INTEGER*2 VARIABLE TO A HEX
  33. ; ASCII DIGIT.  THE INTEGER IS IN THE FIRST PARAMETER AND THE
  34. ; HEX DIGIT IS RETURNED IN THE SECOND PARAMETER (BYTE).  THE
  35. ; INTEGER IS SHIFTED RIGHT BY 4 BEFORE RETURNING.
  36. ;
  37. CNVTBL:    .ASCII    '0123456789ABCDEF'
  38. GETBIT::    MOV    R0,-(SP)        ;
  39.     MOV    @2(R5),R0        ;GET WORD
  40.     BIC    #177760,R0        ;MASK OUT 4 LSB
  41.     MOVB    CNVTBL(R0),@4(R5)    ;CONVERT AND RETURN
  42.     MOV    @2(R5),R0        ;SHIFT INPUT INTEGER
  43.     ASH    #-4,R0            ; RIGHT BY 4.
  44.     MOV    R0,@2(R5)        ;
  45.     MOV    (SP)+,R0        ;
  46.     RTS    PC            ;RETURN
  47.     .PAGE
  48. ;
  49. ; ** ICKVAL **
  50. ;
  51. ; INTEGER FUNCTION TO CHK IF I*2 VARIABLE IS IN THE RANGE
  52. ; -64,63. IF IT IS A VALUE OF 0 IS RETURNED, OTHERWISE
  53. ; A VALUE OF ONE IS RETURNED
  54. ;
  55. ICKVAL::    MOV    @2(R5),R0
  56.     BIT    #177600,R0
  57.     BEQ    10$
  58.     BIC    #177,R0
  59.     CMP    R0,#177600
  60.     BEQ    10$
  61.     MOV    #1,R0
  62.     RTS    PC
  63. 10$:    CLR    R0
  64.     RTS    PC
  65.     .PAGE
  66. ;
  67. ;    THE FOLLOWING INTEGER*4 ARITHMETIC ROUTINES ARE USED INSTEAD
  68. ;    OF F4P CALLS TO PERMIT THE CROSS ASSEMBLER TO RUN WITHOUT
  69. ;    MODIFICATIONS ON EITHER RT-11 OR RSX-11 SYSTEMS
  70. ;
  71. JADD::    CLR    R0        ;INITIALIZE FOR NORMAL EXIT
  72.     TST    (R5)+        ;SKIP COUNT ARG
  73.     MOV    (R5)+,R4    ;ADDR OF OPERAND 1
  74.     MOV    (R5)+,R3    ;ADDR OF OPERAND 2
  75.     MOV    (R5)+,R1    ;ADDR OF RESULT
  76.     MOV    (R4)+,R2    ;GET LOW ORDER OP 1
  77.     ADD    (R3)+,R2    ;ADD IN LOW ORDER OP 2
  78.     MOV    @R4,R5        ;GET HIGH ORDER OP 1
  79.     ADC    R5        ;ADD IN CARRY
  80.     BVS    1$
  81.     ADD    @R3,R5        ;ADD IN HIGH ORDER OP 2
  82.     BVC    2$
  83. 1$:    CLR    R2        ;SET RESULT TO 0
  84.     CLR    R5
  85.     MOV    #-2,R0        ;INDICATE OVERFLOW
  86. 2$:    MOV    R2,(R1)+    ;STORE RESULT
  87.     MOV    R5,@R1
  88.     RTS    PC
  89.     .PAGE
  90. ;
  91. ;    INTEGER*4 SUBTRACTION
  92. ;
  93. JSUB::    CLR    R0        ;INITIALIZE FOR NORMAL EXIT
  94.     TST    (R5)+        ;SKIP COUNT ARG
  95.     MOV    (R5)+,R4    ;ADDR OF OPERAND 1
  96.     MOV    (R5)+,R3    ;ADDR OF OPERAND 2
  97.     MOV    (R5)+,R1    ;ADDR OF RESULT
  98.     MOV    (R4)+,R2    ;GET LOW ORDER OP 1
  99.     SUB    (R3)+,R2    ;SUBTRACT LOW ORDER OP 2
  100.     MOV    @R4,R5        ;GET HIGH ORDER RESULT
  101.     SBC    R5        ;SUBTRACT CARRY
  102.     BVS    1$
  103.     SUB    @R3,R5        ;SUBTRACT HIGH ORDER OP 2
  104.     BVC    2$
  105. 1$:    CLR    R2        ;SET RESULT TO 0
  106.     CLR    R5
  107.     MOV    #-2,R0        ;INDICATE OVERFLOW
  108. 2$:    MOV    R2,(R1)+    ;STORE RESULT
  109.     MOV    R5,@R1
  110.     RTS    PC
  111.     .PAGE
  112. ;
  113. ;    INTEGER*4 MULTIPLICATION
  114. ;
  115. JMUL::    TST    (R5)+        ;SKIP COUNT ARG
  116.     CLR    -(SP)        ;INIT SIGN FLAG
  117.     MOV    (R5)+,R4    ;ADDR OF OPERAND 1
  118.     MOV    (R4)+,R1    ;GET LOW ORDER OP 1
  119.     MOV    @R4,R3        ;GET HIGH ORDER OP 1
  120.     BPL    1$        ;BRNCH IF POSITIVE
  121.     NEG    R3        ;TAKE ABSOLUTE VALUE
  122.     NEG    R1
  123.     SBC    R3
  124.     INC    @SP        ;AND SET SIGN FLAG
  125. 1$:    MOV    (R5)+,R4    ;ADDR OF OPERAND 2
  126.     MOV    (R4)+,R0    ;LOW ORDER OF OP 2
  127.     MOV    @R4,R2        ;HIGH ORDER OF OP 2
  128.     BPL    2$        ;BRAANCH IF POSITIVE
  129.     INC    @SP        ;SET SIGN FLAG
  130.     NEG    R2        ;AND TAKE ABSOLUTE VALUE
  131.     NEG    R0
  132.     SBC    R2
  133. 2$:    BEQ    3$        ;BRANCH IF HIGH PART OF OP 2 IS 0
  134.     TST    R3        ;IF WASN'T OP 2 MUST BE OP 1
  135.     BNE    OVRFL        ;BRANCH IF RESULT WILL BE TOO BIG
  136.     MOV    R0,R4        ;OTHERWISE SWITCH OPS
  137.     MOV    R1,R0
  138.     MOV    R4,R1
  139.     MOV    R2,R3
  140.     CLR    R2
  141. 3$:    CLR    R4        ;RESULT WILL END UP IN R2:R4
  142. 4$:    ROR    R0        ;SHIFT BIT OUT OF MULTIPLIER
  143.     BCC    5$        ;BRANCH IF 0
  144.     ADD    R1,R4        ;ADD LOW PARTS TOGETHER
  145.     ADC    R2        ;ADD IN CARRY
  146.     BVS    OVRFL        ;BRANCH IF OVERFLOW
  147.     ADD    R3,R2        ;ADD HIGH PARTS TOGETHER
  148.     BVS    OVRFL        ;BRANCH IF OVERFLOW
  149.     TST    R0        ;ANY MORE OF MULTIPLIER LEFT?
  150. 5$:    BEQ    DONE        ;BRANCH IF FINISHED
  151.     ASL    R1        ;SHIFT MULTIPLICAND LEFT
  152.     ROL    R3
  153.     BVC    4$        ;LOOP
  154. OVRFL:    MOV    #-2,R0        ;SET OVEFLOW INDICATOR
  155.     CLR    R2        ;SET RESULT TO 0
  156.     CLR    R4
  157. DONE:    ROR    (SP)+        ;GET RESULT SIGN INTO C
  158.     BCC    1$        ;BRANCH IF TO BE POSITIVE
  159.     NEG    R2        ;NEGATE RESULT
  160.     NEG    R4
  161.     SBC    R2
  162. 1$:    MOV    @R5,R1        ;ADDR OF RESULT
  163.     MOV    R4,(R1)+    ;STORE LOW ORDER
  164.     MOV    R2,@R1        ;STORE HIGH ORDER
  165.     RTS    PC
  166.     .PAGE
  167. ;
  168. ;    INTEGER*4 DIVISION
  169. ;
  170. JDIV::    CLR    -(SP)        ;SET SUCCCESSFUL EXIT FLAG
  171.     MOV    (R5)+,-(SP)    ;SAVE ARG COUNT
  172.     MOV    (R5)+,R4    ;ADDR OF NUMERATOR
  173.     MOV    (R5)+,R1    ;ADDR OF DENOMINATOR
  174.     MOV    R5,-(SP)    ;SAVE ADDR OF RESULT
  175.     MOV    #33.,-(SP)    ;SET SHIFT COUNTER
  176.     MOV    (R1)+,R0    ;GET LOW ORDER DENOM
  177.     MOV    @R1,R1        ;GET HIGH ORDER DENOM
  178.     BPL    1$        ;BRANCH IF POSITIVE
  179.     NEG    R1        ;TAKE ABSOLUTE VALUE
  180.     NEG    R0
  181.     SBC    R1
  182.     ADD    #100000,@SP    ;AND SET SIGN FLAG
  183. 1$:    BNE    2$        ;BRANCH IF DENOM CAN'T BE 0
  184.     TST    R0        ;MAKE SURE LOW DENOM ISN'T 0
  185.     BEQ    ZDIV        ;BRANCH IF ZERO DIVIDE
  186. 2$:    MOV    (R4)+,R2    ;LOW ORDER OF NUM
  187.     MOV    @R4,R3        ;HIGH ORDER OF NUM
  188.     BPL    3$        ;BRANCH IF POSITIVE
  189.     ADD    #40000,@SP    ;SET SIGN FLAG
  190.     NEG    R3        ;AND TAKE ABSOLUTE VALUE
  191.     NEG    R2
  192.     SBC    R3
  193. 3$:    CLR    R5        ;QUOTIENT ENDS UP IN R3:R2
  194.     CLR    R4        ;REMAINDER ENDS UP IN R5:R4
  195. 4$:    ROL    R4        ;EXPOSE NEW BIT OF NUMERATOR
  196.     ROL    R5
  197.     CMP    R1,R5        ;DOES DENOM FIT?
  198.     BHI    6$        ;BRANCH IF NOT, C=0
  199.     BNE    5$        ;BRANCH IF YES
  200.     CMP    R0,R4        ;HIGH PARTS SAME, CHECK LOW
  201.     BHI    6$        ;BRANCH IF NOT, C=0
  202. 5$:    SUB    R0,R4        ;SUBTRACT DENOM FROM REMAINDER
  203.     SBC    R5
  204.     SUB    R1,R5
  205.     SEC            ;INDICATE NEW QUOTIENT BIT
  206. 6$:    ROL    R2        ;SHIFT IN NEW BIT OF QUOTIENT
  207.     ROL    R3
  208.     DECB    @SP        ;CHECK LOOP COUNT
  209.     BGT    4$        ;BRANCH TO LOOP
  210. ENDCOD:    ASL    @SP        ;PUT QUOTIENT RESULT SIGN IN V
  211.     BVC    1$        ;BRANCH IF TO BE POSITIVE
  212.     NEG    R3        ;NEGATE QUOTIENT
  213.     NEG    R2
  214.     SBC    R3
  215. 1$:    TST    (SP)+        ;GET REMAINDERS SIGN
  216.     BPL    2$        ;BRANCH IF REMAINDER TO BE POSITIVE
  217.     NEG    R5        ;NEGATE REMAINDER
  218.     NEG    R4
  219.     SBC    R5
  220. 2$:    MOV    (SP)+,R0    ;GET ARG LIST POINTER AGAIN
  221.     MOV    (R0)+,R1    ;ADDR OF QUOTIENT RESULT
  222.     CMPB    #3,(SP)+    ;CHECK NUMBER OF ARGUMENTS
  223.     BEQ    3$        ;BRANCH IF ONLY 3 PASSED
  224.     MOV    @R0,R0        ;GET ADDR REMAINDER RESULT
  225.     MOV    R4,(R0)+    ;STORE LOW
  226.     MOV    R5,@R0        ;STORE HIGH
  227. 3$:    MOV    R2,(R1)+    ;STORE LOW QUOTIENT RESULT
  228.     MOV    R3,@R1        ;STORE HIGH
  229.     TST    (SP)+
  230.     RTS    PC
  231. ZDIV:    CLR    R4        ;SET REMAINDER TO 0
  232.     CLR    R5
  233.     CLR    R2        ;SET QUOTIENT TO 0
  234.     CLR    R3
  235.     MOV    #-3,6(SP)    ;SET ZDIV ERROR INDICATOR
  236.     BR    ENDCOD        ;GO SET RESULTS
  237.     .PAGE
  238. ;
  239. ;    INTEGER*4 LOGICAL AND
  240. ;
  241. JAND::    TST    (R5)+        ;SKIP COUNT ARGUMENT
  242.     MOV    (R5)+,R0    ;ADR OF NUMBER
  243.     MOV    (R5)+,R1    ;ADR OF NUMBER TO BE ANDED
  244.     MOV    (R5)+,R2    ;ADR OF DESTINATION
  245.     MOV    (R0)+,R3    ;GET VAL OF HIGH PART OF NUMBER
  246.     MOV    (R1)+,R4    ;GET VAL OF HIGH PART OF MASK
  247.     COM    R4        ;INVERT MASK BITS
  248.     BIC    R4,R3        ;AND 'EM
  249.     MOV    R3,(R2)+    ;STORE RESULT IN DESTINATION
  250.     MOV    (R0),R3        ;GET VAL OF LOW PART OF NUMBER
  251.     MOV    (R1),R4        ;GET VAL OF LOW PART OF MASK
  252.     COM    R4        ;INVERT MASK BITS
  253.     BIC    R4,R3        ;AND 'EM
  254.     MOV    R3,(R2)        ;STORE RESULT IN DESTINATION
  255.     CLR    R0        ;CLR VAL OF FUNCTION
  256.     RTS    PC
  257.     .PAGE
  258. ;
  259. ;    INTEGER*4 INCLUSIVE OR
  260. ;
  261. JOR::    TST    (R5)+        ;SKIP OVER ARGUMENT COUNT
  262.     MOV    (R5)+,R0    ;ADR OF NUMBER
  263.     MOV    (R5)+,R1    ;ADR OF NUMBER TO BE OR'ED
  264.     MOV    (R5)+,R2    ;ADR OF DESTINATION
  265.     MOV    (R0)+,R3    ;GET VAL OF HIGH PART OF NUMBER
  266.     MOV    (R1)+,R4    ;GET VAL OF HIGH PART OF OR MASK
  267.     BIS    R4,R3        ;OR 'EM
  268.     MOV    R3,(R2)+    ;STORE RESULT IN DESTINATION
  269.     MOV    (R0),R3        ;GET VAL OF LOW PART OF NUMBER
  270.     MOV    (R1),R4        ;GET VAL OF LOW PART OF OR MASK
  271.     BIS    R4,R3        ;OR 'EM
  272.     MOV    R3,(R2)        ;STORE RESULT IN DESTINATION
  273.     CLR    R0        ;STD FUNCTION RETURN VAL
  274.     RTS    PC
  275.     .PAGE
  276. ;
  277. ; ** JLSHF **
  278. ;
  279. ;    INTEGER*4 LEFT SHIFT (UNSIGNED)
  280. ;
  281. JLSHF::    TST    (R5)+        ;SKIP OVER ARGUMENT COUNT
  282.     MOV    (R5),R0        ;SRC ADR
  283.     MOV    @2(R5),R1    ;NUMBER OF BITS TO SHIFT IT
  284.     MOV    4(R5),R2    ;DEST ADR
  285.     MOV    (R0)+, (R2)    ;MOVE SRC TO DEST
  286.     MOV    (R0) ,2(R2)
  287.     TST    R1
  288.     BEQ    99$        ;SHIFTING 0 BITS IS SILLY
  289.     CMP    R1,#40
  290.     BHI    99$        ;CAN'T SHIFT MORE THAN 32 BITS
  291. 1$:    CLC            ;MAKE SURE CARRY IS CLEAR
  292.     ROL    (R2)        ;SHIFT LO HALF 1 BIT
  293.     ROL    2(R2)        ;SHIFT HI WRD
  294. 3$:    DEC    R1        ;DECR #BITS TO SHIFT
  295.     BNE    1$        ;LOOP IF NON ZERO
  296. ;
  297. 99$:    CLR    R0
  298.     RTS    PC
  299.     .PAGE
  300. ;
  301. ; ** JRSHF **
  302. ;
  303. ;    INTEGER*4 RIGHT SHIFT (UNSIGNED)
  304. ;
  305. JRSHF::    TST    (R5)+        ;SKIP OVER ARGUMENT COUNT
  306.     MOV    (R5),R0        ;ADR OF NUMBER TO SHIFT
  307.     MOV    @2(R5),R1    ;NUMBER OF BITS TO SHIFT IT
  308.     MOV    4(R5),R2    ;DESTINATION ADDRESS
  309.     MOV    (R0)+, (R2)    ;MOVE SRC TO DEST
  310.     MOV    (R0) ,2(R2)
  311.     TST    R1
  312.     BEQ    99$        ;SHIFTING 0 BITS IS SILLY
  313.     CMP    R1,#40
  314.     BHI    99$        ;CAN'T SHIFT MORE THAN 32 BITS
  315. 1$:    CLC            ;MAKE SURE CARRY IS CLEAR
  316.     ROR    2(R2)        ;SHIFT HI HALF 1 BIT
  317.     ROR    (R2)        ;SHIFT LO WRD
  318.     DEC    R1        ;DECR #BITS TO SHIFT
  319.     BNE    1$        ;LOOP IF NON ZERO
  320. ;
  321. 99$:    CLR    R0
  322.     RTS    PC
  323.     .PAGE
  324. ;
  325. ; ** JICMP **
  326. ;
  327. ;    COMPARE A 32 BIT SIGNED NUMBER WITH A 16 BIT SIGNED NUMBER
  328. ;    FUNCTION RETURNS A VALUE OF ZERO IF THE NUMBERS ARE EQUIVALENT
  329. ;
  330. JICMP::    TST    (R5)+
  331.     MOV    (R5)+,R0    ;ADR OF I*4 VALUE
  332.     MOV    @(R5)+,R1    ;VALUE OF I*2 NUMBER
  333.     TST    R1        ;SEE IF VAL NEGATIVE
  334.     BPL    1$        ;
  335.     CMP    (R0),#177777    ;SEE IF NUMBER NEGATIVE
  336.     BNE    99$        ;NUMBER NOT NEGATIVE
  337.     BR    2$
  338. 1$:    TST    (R0)        ;IF I*2 NUMBER NOT NEG THEN HI WORD
  339.     BNE    99$        ;MUST BE ZERO
  340. 2$:    CMP    2(R0),R1    ;CMP THE TWO NUMBERS
  341.     BNE    99$
  342.     CLR    R0
  343.     RTS    PC        ;NUMBERS ARE EQUAL
  344. 99$:    MOV    #1,R0        ;NUMBERS NOT EQUAL
  345.     RTS    PC
  346.     .PAGE
  347. ;
  348. ; ** JMOV **
  349. ;
  350. ;    INTEGER*4 MOVE
  351. ;
  352. JMOV::    CLR    R0        ;INITIALIZE FOR NORMAL EXIT
  353.     TST    (R5)+        ;SKIP COUNT ARG
  354.     MOV    (R5)+,R4    ;ADDR OF OPERAND 1
  355.     MOV    (R5)+,R1    ;ADDR OF OPERAND 2
  356.     MOV    (R4)+,(R1)+    ;MOVE LOW PART
  357.     MOV    @R4,@R1        ;MOVE HIGH PART
  358.     RTS    PC
  359.     .PAGE
  360. ;
  361. ; ** BLDMAP (DLIST,ALIST,OUTPUT) **
  362. ;
  363. ;    CREATE A REGISTER BITMAP FROM A DATA AND ADR REG MAP
  364. ;
  365. BLDMAP:: TST    (R5)+        ;SKIP OVER ARG COUNT
  366.     MOV    @(R5)+,R0    ;GET DATA BITMAP
  367.     BIC    #177400,R0    ;MAKE SURE NO EXTRA BITS SET
  368.     MOV    @(R5)+,R1    ;GET ADR BITMAP
  369.     BIC    #177400,R1    ;MAKE SURE NO EXTRA BITS SET
  370.     SWAB    R1        ;MOVE ADR REG BITS UP WHERE THEY BELONG
  371.     BIS    R0,R1        ;OR IN THE D-REG BITS
  372.     MOV    R1,@(R5)    ;SAVE THE RESULT IN THE DESTINATION
  373.     RTS    PC        ;AND RETURN
  374.     .PAGE
  375. ;
  376. ; ** JICVT (I*2,I*4 RESULT) **
  377. ;
  378. ;    I*2 TO I*4 CONVERSION (SIGNED)
  379. ;
  380. JICVT::    TST    (R5)+        ;SKIP COUNT ARG
  381.     CLR    R2        ;INIT SIGN EXTEND WORD
  382.     MOV    @(R5)+,R0    ;GET INTEGER VALUE
  383.     BPL    1$        ;BRANCH IF POSITIVE
  384.     DEC    R2        ;SET SIGN EXTEND WORD
  385. 1$:    MOV    @R5,R1        ;ADDR OF RESULT
  386.     MOV    R0,(R1)+    ;STORE LOW ORDER
  387.     MOV    R2,@R1        ;STORE HIGH ORDER
  388.     CLR    R0        ;INITIALIZE FOR NORMAL EXIT
  389.     RTS    PC
  390.     .END
  391.